function New (obj, ...args) {
	// 1. 在内存中创建一个新对象
	const newObj = {};
	// 2. 将这个新对象内部的[[__proto__]]特性被赋值为构造函数的prototype属性
	newObj.__proto__ = obj.prototype;
	// 以上两步可以合并为：let newObj = Object.create(obj.prototype)
	// 3. 构造函数内部的this被赋值为这个新对象（this指向新对象）
	// 4. 执行构造函数内部的代码（给新对象添加属性）
	let result = obj.apply(newObj, args); // apply 接收数组形式的参数
	// 5. 如果构造函数返回非空对象，则返回该对象，否则返回刚创建的新对象
	return typeof result === 'object' ? result : newObj;
}

function Student (name, age) {
	// 构造函数的首字母要大写
	this.name = name;
	this.age = age;
	this.sayName = function () {
		console.log(this.name);
	}
}

let student = new Student('alien', 18);
// console.log(student) //Student {name: 'alien', age: 18, sayName: ƒ}
let myStudent = New(Student, 'alien1', 19);
console.log(myStudent); //Student {name: 'alien1', age: 19, sayName: ƒ}